#ifndef XFORMAT_H
#define XFORMAT_H
#include <mutex>
class AVFormatContext;
class AVCodecParameters;
class AVPacket;
struct XRational {
  int num; ///< Numerator
  int den; ///< Denominator
};
class XFormat {
public:
  virtual ~XFormat() {}
  /// \brief CopyPara 复制参数 线程安全
  /// \param stream_index 对应流的位置，对应streams的下标
  /// \param dst 输出参数
  /// \return
  bool CopyPara(int stream_index, AVCodecParameters *dst);
  /////////////////////////////
  /// \brief set_c 设置封装或解封装的上下文，如果c为nullptr，相当于关闭
  /// \param c 上下文
  /// info：需要注意的是，对于封装需要提前设置好avstream的Type
  void set_c(AVFormatContext *c);

  int audio_index() { return audio_index_; }
  int video_index() { return video_index_; }

  XRational video_time_base() { return video_time_base_; }
  XRational audio_time_base() { return audio_time_base_; }
  // 根据time_base计算
  bool RescaleTime(AVPacket *pkt, long long offset_pts,XRational time_base);

protected:
  AVFormatContext *c_ = nullptr; // 封装或解封装上下文
  std::mutex mux_;               // c_的互斥量
  int audio_index_ = 1;
  int video_index_ = 0;
  XRational video_time_base_ = {1, 25};
  XRational audio_time_base_ = {1, 9000};
};

#endif // XFORMAT_H
